home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / src / ConfigFileSrc.lha / ConfigFileSrc12 / RexxLibrary / LibCode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-02  |  7.1 KB  |  315 lines

  1. /*
  2. **        $PROJECT: RexxConfigFile.library
  3. **        $FILE: LibCode.c
  4. **        $DESCRIPTION: Code for library init, open and close.
  5. **
  6. **        (C) Copyright 1997 Marcel Karas
  7. **             All Rights Reserved.
  8. */
  9.  
  10. #include "RexxConfigFile.library_rev.h"
  11.  
  12. LibCall  struct RXCFBase *    LibInit ( REGA0 BPTR, REGD0 struct RXCFBase *, REGA6 struct ExecBase * );
  13. SLibCall struct RXCFBase *    LibOpen ( REGA6 struct RXCFBase * );
  14. LibCall  BPTR                    LibExpunge ( REGA6 struct RXCFBase * );
  15. SLibCall BPTR                    LibClose ( REGA6 struct RXCFBase * );
  16. LONG                                 LibNull ( VOID );
  17.  
  18. __stdargs __saveds ULONG RexxDispatch ( struct RexxMsg *, UBYTE ** );
  19. __stdargs VOID AsmRexxDispatch ( VOID );
  20.  
  21. #include "Funcs.h"
  22.  
  23. extern UWORD __far    LibVersion,
  24.                             LibRevision;
  25.  
  26. extern UBYTE __far    LibName[],
  27.                             LibID[];
  28.  
  29. struct ExecBase    *SysBase = 0;
  30. struct DosLibrary    *DOSBase = 0;
  31. struct Library        *RexxSysBase = 0;
  32. struct Library        *CFBase = 0;
  33.  
  34. IMPORT UBYTE OpenCount;
  35.  
  36. APTR LibVectors[] =
  37. {
  38.     LibOpen,
  39.     LibClose,
  40.     LibExpunge,
  41.     LibNull,
  42.  
  43.     AsmRexxDispatch,
  44.  
  45.     (APTR)-1
  46. };
  47.  
  48. struct { ULONG DataSize; APTR Table; APTR Data; struct RXCFBase * (*Init)(); }
  49. __aligned LibInitTab =
  50. {
  51.     sizeof(struct RXCFBase),
  52.     LibVectors,
  53.     NULL,
  54.     LibInit
  55. };
  56.  
  57.     /* LibInit():
  58.      *
  59.      *    Initialize the library.
  60.      */
  61.  
  62. LibCall struct RXCFBase *
  63. LibInit ( REGA0 BPTR LibSegment, REGD0 struct RXCFBase * RXCFBase, REGA6 struct ExecBase * ExecBase )
  64. {
  65.     RXCFBase->LibNode.lib_Node.ln_Type    = NT_LIBRARY;
  66.     RXCFBase->LibNode.lib_Node.ln_Name    = LibName;
  67.     RXCFBase->LibNode.lib_Node.ln_Pri    = 100;
  68.     RXCFBase->LibNode.lib_Flags            = LIBF_CHANGED | LIBF_SUMUSED;
  69.     RXCFBase->LibNode.lib_Version            = LibVersion;
  70.     RXCFBase->LibNode.lib_Revision        = LibRevision;
  71.     RXCFBase->LibNode.lib_IdString        = LibID;
  72.  
  73.     RXCFBase->Segment = LibSegment;
  74.  
  75.     SysBase = ExecBase;
  76.  
  77.     if ( CFBase = OpenLibrary (CF_NAME, CF_VERSION) )
  78.     {
  79.         if ( RexxSysBase = OpenLibrary ("rexxsyslib.library", 36L) )
  80.         {
  81.             DOSBase = (struct DosLibrary *) TaggedOpenLibrary (TLIB_DOS);
  82.             return (RXCFBase);
  83.         }
  84.     }
  85.  
  86.     return (NULL);
  87. }
  88.  
  89.     /* LibOpen():
  90.      *
  91.      *    Open the library, as called via OpenLibrary()
  92.      */
  93.  
  94. SLibCall struct RXCFBase *
  95. LibOpen ( REGA6 struct RXCFBase * RXCFBase )
  96. {
  97.     RXCFBase->LibNode.lib_OpenCnt++;
  98.     RXCFBase->LibNode.lib_Flags &= ~LIBF_DELEXP;
  99.  
  100.     return (RXCFBase);
  101. }
  102.  
  103.     /* LibExpunge();
  104.      *
  105.      *    Expunge the library, remove it from memory
  106.      */
  107.  
  108. LibCall BPTR
  109. LibExpunge ( REGA6 struct RXCFBase * RXCFBase )
  110. {
  111.     if ( !RXCFBase->LibNode.lib_OpenCnt && !OpenCount ) // If OpenCnt Null
  112.     {
  113.         BPTR TempSegment = RXCFBase->Segment;
  114.  
  115.         CloseLibrary (CFBase);
  116.         CloseLibrary (RexxSysBase);
  117.         CloseLibrary (DOSBase);
  118.  
  119.         Remove (RXCFBase);
  120.  
  121.         FreeMem ((BYTE *)RXCFBase-RXCFBase->LibNode.lib_NegSize,
  122.                     RXCFBase->LibNode.lib_NegSize+RXCFBase->LibNode.lib_PosSize);
  123.  
  124.         return (TempSegment);
  125.     }
  126.     else
  127.     {
  128.         RXCFBase->LibNode.lib_Flags |= LIBF_DELEXP;
  129.  
  130.         return (NULL);
  131.     }
  132. }
  133.  
  134.     /* LibClose();
  135.      *
  136.      *    Close the library, as called by CloseLibrary()
  137.      */
  138.  
  139. SLibCall BPTR
  140. LibClose ( REGA6 struct RXCFBase * RXCFBase )
  141. {
  142.     RXCFBase->LibNode.lib_OpenCnt--;
  143.  
  144.     if ( RXCFBase->LibNode.lib_Flags & LIBF_DELEXP )
  145.             return (LibExpunge (RXCFBase));
  146.  
  147.     return (NULL);
  148. }
  149.  
  150.     /* LibNull();
  151.      *
  152.      *    Mandatory dummy function
  153.      */
  154.  
  155. LONG LibNull (VOID)
  156. {
  157.     return (NULL);
  158. }
  159.  
  160. /***************************************************************************/
  161.  
  162. #define    BUILTIN_FUNCS        60
  163.  
  164. typedef struct FuncListEntry
  165. {
  166.     STRPTR    String;
  167.     UBYTE        MinArgs;
  168.     UBYTE        MaxArgs;
  169.     UWORD        (*Function)( struct RexxMsg *, UBYTE **, VOID * );
  170. } FuncListEntry;
  171.  
  172. struct FuncListEntry  FuncList[BUILTIN_FUNCS] =
  173. {
  174.     "OPEN"                ,1,4,rxcf_Open,
  175.     "CLOSE"                ,1,1,rxcf_Close,
  176.  
  177.     "READ"                ,1,1,rxcf_Read,
  178.     "WRITE"                ,1,3,rxcf_Write,
  179.  
  180.     "NEWARGUMENT"        ,2,2,rxcf_NewArgument,
  181.     "NEWGROUP"            ,2,2,rxcf_NewGroup,
  182.     "NEWITEM"            ,2,4,rxcf_NewItem,
  183.     "NEWARGITEM"        ,3,5,rxcf_NewArgItem,
  184.  
  185.     "GETITEM"            ,3,3,rxcf_GetItem,
  186.     "GETITEMNUM"        ,4,4,rxcf_GetItemNum,
  187.  
  188.     "LOCKARGLIST"        ,1,1,rxcf_LockArgList,
  189.     "LOCKGRPLIST"        ,1,1,rxcf_LockGrpList,
  190.     "LOCKITEMLIST"        ,1,1,rxcf_LockItemList,
  191.  
  192.     "UNLOCKARGLIST"    ,1,1,rxcf_UnlockArgList,
  193.     "UNLOCKGRPLIST"    ,1,1,rxcf_UnlockGrpList,
  194.     "UNLOCKITEMLIST"    ,1,1,rxcf_UnlockItemList,
  195.  
  196.     "NEXTARGUMENT"        ,1,1,rxcf_NextArgument,
  197.     "NEXTGROUP"            ,1,1,rxcf_NextGroup,
  198.     "NEXTITEM"            ,1,1,rxcf_NextItem,
  199.  
  200.     "LASTARGUMENT"        ,1,1,rxcf_LastArgument,
  201.     "LASTGROUP"            ,1,1,rxcf_LastGroup,
  202.     "LASTITEM"            ,1,1,rxcf_LastItem,
  203.  
  204.     "DISPOSEARGUMENT"    ,1,1,rxcf_DisposeArgument,
  205.     "DISPOSEGROUP"        ,1,1,rxcf_DisposeGroup,
  206.     "DISPOSEITEM"        ,1,1,rxcf_DisposeItem,
  207.  
  208.     "CLONEARGUMENT"    ,1,1,rxcf_CloneArgument,
  209.     "CLONEGROUP"        ,1,1,rxcf_CloneGroup,
  210.     "CLONEITEM"            ,1,1,rxcf_CloneItem,
  211.  
  212.     "CLEARARGLIST"        ,1,1,rxcf_ClearArgList,
  213.     "CLEARGRPLIST"        ,1,1,rxcf_ClearGrpList,
  214.     "CLEARITEMLIST"    ,1,1,rxcf_ClearItemList,
  215.  
  216.     "CHANGEARGUMENT"    ,2,2,rxcf_ChangeArgument,
  217.     "CHANGEGROUP"        ,2,2,rxcf_ChangeGroup,
  218.     "CHANGEITEM"        ,2,4,rxcf_ChangeItem,
  219.  
  220.     "FINDARGUMENT"        ,2,2,rxcf_FindArgument,
  221.     "FINDGROUP"            ,2,2,rxcf_FindGroup,
  222.     "FINDITEM"            ,3,3,rxcf_FindItem,
  223.  
  224.     "ADDARGUMENT"        ,2,2,rxcf_AddArgument,
  225.     "ADDGROUP"            ,2,2,rxcf_AddGroup,
  226.     "ADDITEM"            ,2,2,rxcf_AddItem,
  227.  
  228.     "REMOVEARGUMENT"    ,1,1,rxcf_RemoveArgument,
  229.     "REMOVEGROUP"        ,1,1,rxcf_RemoveGroup,
  230.     "REMOVEITEM"        ,1,1,rxcf_RemoveItem,
  231.  
  232.     "GETITEMTYPE"        ,1,1,rxcf_GetItemType,
  233.     "GETITEMSTYPE"        ,1,1,rxcf_GetItemSType,
  234.  
  235.     "GETGRPNAME"        ,1,1,rxcf_GetGrpName,
  236.     "GETARGNAME"        ,1,1,rxcf_GetArgName,
  237.  
  238.     "GETHDROFGRP"        ,1,1,rxcf_GetHdrOfGrp,
  239.     "GETGRPOFARG"        ,1,1,rxcf_GetGrpOfArg,
  240.     "GETARGOFITEM"        ,1,1,rxcf_GetArgOfItem,
  241.  
  242.     "GETITEMONLY"        ,1,1,rxcf_GetItemOnly,
  243.  
  244.     "GETOMODE"            ,1,1,rxcf_GetOMode,
  245.     "GETWBUFSIZE"        ,1,1,rxcf_GetWBufSize,
  246.     "GETPUDDLESIZE"    ,1,1,rxcf_GetPuddleSize,
  247.  
  248.     "CHKHDRFLAG"        ,2,2,rxcf_ChkHdrFlag,
  249.     "ADDHDRFLAG"        ,2,2,rxcf_AddHdrFlag,
  250.     "REMHDRFLAG"        ,2,2,rxcf_RemHdrFlag,
  251.     "SETWBUFSIZE"        ,2,2,rxcf_SetWBufSize
  252. };
  253.  
  254. __stdargs __saveds ULONG RexxDispatch ( struct RexxMsg * RxMsg, UBYTE ** ResultStr )
  255. {
  256.     ULONG    Result = RXERR_FUNC_NOT_FOUND;
  257.  
  258.     if ( IsRexxMsg(RxMsg) || ( (RXCODEMASK & RxMsg->rm_Action) != RXFUNC ) )
  259.     {
  260.         UBYTE        NumEntry, NumArgs;
  261.         STRPTR    FuncName = ARG0(RxMsg);
  262.         STRPTR    ResStr = NULL;
  263.         FuncListEntry *FuncEntry = 0;
  264.  
  265.         if ( ( *((ULONG *)FuncName) & 0xFFFFFF00L ) != 0x43465F00 ) // If 'CF_ '
  266.             goto OnError;
  267.  
  268.         FuncName += 3;
  269.  
  270.         for (NumEntry = 0; NumEntry < BUILTIN_FUNCS; NumEntry ++ )
  271.         {
  272.             if ( !StrCmp (FuncName, FuncList[NumEntry].String) )
  273.             {
  274.                 FuncEntry = &FuncList[NumEntry];
  275.                 break;
  276.             }
  277.         }
  278.  
  279. //        if ( NumEntry == BUILTIN_FUNCS )    goto OnError;
  280.         if ( !FuncEntry )    goto OnError;
  281.  
  282.         NumArgs = RxMsg->rm_Action & RXARGMASK;
  283.  
  284.         if ( (NumArgs < FuncEntry->MinArgs) || (NumArgs > FuncEntry->MaxArgs) )
  285.             return (RXERR_WRONG_NUM_ARGS);
  286.  
  287.         if ( !RXARG1 )    return (RXERR_INVALID_ARG);
  288.  
  289.         if ( !NumEntry ) // FuncEntry->MaxArgs & NOFIRST_ADR_ARG
  290.             Result = (FuncEntry->Function) (RxMsg, &ResStr, RXARG1);
  291.         else
  292.         {
  293.             VOID *FirstAdrArg;
  294.  
  295.             if ( StrToLong (RXARG1, (LONG *)&FirstAdrArg) != -1 )
  296.                 Result = (FuncEntry->Function) (RxMsg, &ResStr, FirstAdrArg);
  297.             else return (RXERR_INVALID_ARG);
  298.         }
  299.  
  300.         if ( Result == RC_OK )
  301.         {
  302. /*
  303.             if ( !( *ResultStr = ResStr ? ResStr : CreateArgstring("",0) ) )
  304.                 return (RXERR_NO_MEMORY);
  305. */
  306.             if ( !( *ResultStr = ResStr ? ResStr : SetRC_FALSE () ) )
  307.                 return (RXERR_NO_MEMORY);
  308.         }
  309.     }
  310.     else Result = RXERR_INVALID_MSGPKT;
  311.  
  312. OnError:
  313.     return (Result);
  314. }
  315.